package com.liu.shopcar.interceptor;

import com.liu.shop.common.constant.AuthConstants;
import com.liu.shop.common.constant.CarConstants;
import com.liu.shop.common.vo.UserVo;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

/**
 * 前置拦截器
 * 拦截这个模块的所有请求，
 * 判断用户是否登录了，登录了就返回用户id，没有登录就返回一个uuid
 */
@Component
public class UserCarInterceptor implements HandlerInterceptor {

    // 只要调用这个线程就可以拿到线程中的数据（当地线程）
    private ThreadLocal<String> userCarIdThreadlocal = new ThreadLocal<>();

    public String get() {
        // 取值
        return userCarIdThreadlocal.get();
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取用户登录后的session
        UserVo userVo = (UserVo) request.getSession().getAttribute(AuthConstants.LOGIN_USER);
        String userCarId = null;
        if (userVo != null) {
            // 用户登录了
            userCarId = userVo.getId();
        } else {

            // 用户没有登录，可能存在第一次或者第n次，所以就用uuid作为唯一标识，
            // 先在cookie中查询这个没有登录的用户,不是第一次没有登录将商品加入购物车,是就直接用之前存在cookie中的uuid作为购物车id
            Cookie[] cookies = request.getCookies();
            if (cookies != null && cookies.length > 0) {
                for (Cookie cookie : cookies) {
                    String name = cookie.getName();
                    // 将redis中存储的用户购物车id和当前的cookie对比
                    if (CarConstants.CAR_ANON_NAME.equals(name)) {
                        // 如果相同就说明之前有过登录，就将这个cookie中的uuid设为购物车id
                        userCarId = cookie.getValue();
                        break;
                    }
                }
            }
            // 如果用户没有登录，而且是第一次没有登录，就生成一个uuid存入cookie中
            if (userCarId == null) {
                // 生成一个新的UUID
                userCarId = UUID.randomUUID().toString();
                // 存到Cookie中
                Cookie cookie = new Cookie(CarConstants.CAR_ANON_NAME, userCarId);
                cookie.setMaxAge(60 * 60 * 24 * 7); // 7天
                cookie.setPath("/"); //解决cookie跨域二级问题

                // 把cookie写入到responce中
                response.addCookie(cookie);
            }
        }
        // 放到ThreadLocal中
        userCarIdThreadlocal.set(userCarId);
        return true;
    }
}
